
#ifndef TERRENO_H_
#define TERRENO_H_

#include "displaylist.h"
#include "discretizador.h"
#include "vertexs.h"
#include "textura.h"
#include "fisica/objeto.h"
#include <BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h>
#include "heightfield.h"

class Terreno : public DisplayList, public Fisica::Objeto {
   private:
      Textura &textura;
      const Vertexs *vertexs_superficie;

      void liberarRecursos() {
         if(vertexs_superficie) {
            delete vertexs_superficie;
            vertexs_superficie = 0;
         }
      }

   public:
      /*
       * Se encarga de renderizar el terreno, compuesto por 
       * una superficie HeightField
       * 
       * La superficie representa una superficie que sera discretizada
       * por el objeto "disc".
       * El renderizado sera mapeado usando la textura pasada.
       *
       * */
      Terreno(Textura &textura, const HeightField &superficie, 
            const Discretizador &disc) :

         Objeto( *(new btHeightfieldTerrainShape(
                     superficie.getX(), superficie.getY(),
                     const_cast<float*>(superficie.data()), //Arggg XXX
                     float(1.0), superficie.minHeight(), superficie.maxHeight(), 
                     2, PHY_FLOAT, 
                     false)) ,
               superficie.ancho()/2.0, superficie.alto()/2.0, (superficie.maxHeight() - superficie. minHeight())/2.0,  //El minZ puesto en z=0
               0),
         textura(textura), 
         vertexs_superficie(disc.superficie(superficie)) {

            inicializar();
            if(esValido()) {
               liberarRecursos();
            }
         }

      virtual void ejecucion() const {
         textura.enlazar();

         vertexs_superficie->enlazar();
         vertexs_superficie->dibujar();

         textura.desenlazar();
      }

      virtual ~Terreno() {
         liberarRecursos();
      }
};

#endif
